// 除非遵守许可证，否则不得使用此文件。
// 您可以通过
// 
// www.apache.org/licenses/LICENSE-2.0 
// 
// 除非适用法律要求或书面同意，否则根据许可证分发的软件
// 按“原样”分发，
// 无任何明示或暗示的保证或条件。
// 请参阅许可证，了解管理许可的特定语言和
// 许可证下的限制。

package notify

import (
	"sync"
)

// 通知程序是一个线程安全结构，可用于向多个使用者发送有关
// 某个事件的通知。
type Notifier struct {
	mu      sync.RWMutex
	channel chan struct{}
}

// NewNotifier返回新通知程序
func NewNotifier() *Notifier {
	return &Notifier{
		channel: make(chan struct{}),
	}
}

// 接收返回可用于等待通知的通道。
// 将通过关闭渠道通知消费者。
func (n *Notifier) Receive() <-chan struct{} {
	n.mu.RLock()
	defer n.mu.RUnlock()
	return n.channel
}

// Notify关闭传递给消费者的频道，并创建新频道用于下次通知。
func (n *Notifier) Notify() {
	newChannel := make(chan struct{})
	n.mu.Lock()
	channelToClose := n.channel
	n.channel = newChannel
	n.mu.Unlock()
	close(channelToClose)
}
